/**
 * Ajax请求 同一时间只会有一个Ajax请求	如果第一个请求没有返回，第二个请求会放入缓存，等第一个请求完成后，再会执行第二个请求
 * 使用：FWK.Util.AjaxList.open(_aURL,_aTransType,_ParameterObj,_IsAsync,_callBack);
 * _aURL:			请求地址
 * _aTransType：		请求方式
 * _ParameterObj：	请求动态参数
 * _IsAsync：		同步：sync 	异步：async
 * _callBack：		回调函数，并传递参数：false：失败，XML | Text 成功
 * 例如：FWK.Util.AjaxList.open("/all.xml","GET",{},"async",function(_xml){});
 */

/**
 * 先销毁 XMLHttpRequest 再创建 XMLHttpRequest
 */
FWK.Util = FWK.Util || {};

FWK.Util.reSetHTTPResponse = function(){
	try {
		FWK.Util.AjaxList.destroy();
	} 
	catch (e) {
	}
	try{
		FWK.Util.xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e) {
		try{
			FWK.Util.xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e) {
			try{
				FWK.Util.xmlHttpRequest = new XMLHttpRequest();
			}
			catch(e) {
				FWK.Util.xmlHttpRequest = false;
			}
		}
	}
}
/**
 * Ajax构建类
 */
FWK.Util.AjaxList = {
	requests:[],
	isIdlesse:true,		//Ajax是否空闲
	/**
	 * 添加Ajax请求，参数和submit一模一样
	 */
	open:function(){
		if(this.isIdlesse){
			this.submit.apply(this, arguments);
		}
		else{
			this.requests.push(arguments);
		}
	},
	/**
	 * Ajax请求服务器 和以前的基本一样 增加一个回调函数传入
	 * @param {String} 		_aURL
	 * @param {String} 		_aTransType
	 * @param {Object} 		_ParameterObj
	 * @param {Function} 	_callBack
	 */
	submit:function(_aURL,_aTransType,_ParameterObj,_callBack,_time){
		FWK.Util.AjaxList.isIdlesse = false;
		FWK.Util.AjaxList.time = null;
		FWK.Util.AjaxList.callBack = null;
		
		var strs = [];
		strs.push(((_aURL.indexOf("?")>-1)?"&r=":"?r=")+Math.random(1000));
		_aTransType = String(_aTransType).toUpperCase()=="GET"?"GET":"POST";
		if(_ParameterObj)
		{
			if (typeof(_ParameterObj)=="string") {
				strs.push(_ParameterObj);
			}
			else{
				for (var n in _ParameterObj) {
					strs.push(n+"="+encodeURIComponent(_ParameterObj[n]));
				}
			}
		}
		
		var parameterStr = strs.join("&");
		
		FWK.Util.reSetHTTPResponse();
		
		if(_aTransType=="POST"){
			FWK.Util.xmlHttpRequest.open("POST", _aURL, true);
			FWK.Util.xmlHttpRequest.setRequestHeader("Method", "POST "+_aURL+" HTTP/1.1");
			FWK.Util.xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			parameterStr = parameterStr.replace(/[\x00-\x08\x11-\x12\x14-\x20]/g,"*");
		}
		else{
			FWK.Util.xmlHttpRequest.open("GET", _aURL + parameterStr, true);
			parameterStr = null;
		}
		
		if(FWK.Util.xmlHttpRequest.overrideMimeType) {
			FWK.Util.xmlHttpRequest.overrideMimeType('text/xml');
		}
		
		//异步执行		使用到Function.prototype.bind函数绑定
		FWK.Util.AjaxList.callBack = _callBack;
		FWK.Util.xmlHttpRequest.onreadystatechange = FWK.Util.AjaxList.onreadystatechange;
		
		FWK.Util.xmlHttpRequest.send(parameterStr);
		
		if(_callBack && _time && FWK.isNum(_time)){
			FWK.Util.AjaxList.time = setTimeout(FWK.Util.AjaxList.abortNext,_time*1000);
		}
	},
	onreadystatechange:function(){
		if(FWK.Util.xmlHttpRequest.readyState == 4) {
			var xml = false;
			if(FWK.Util.AjaxList.callBack){
				if(FWK.Util.AjaxList.time){
					clearTimeout(FWK.Util.AjaxList.time);
				}
				
				if(FWK.Util.xmlHttpRequest.status == 200){
					if(FWK.isKhtml){
						try{xml = FWK.loadXML((FWK.Util.xmlHttpRequest.responseText + "").replace(/<(\w+)\/>/gi,"<$1></$1>"));}catch(e){xml = FWK.Util.xmlHttpRequest.responseXML || xml}
					}
					else{
						try{xml = FWK.loadXML(FWK.Util.xmlHttpRequest.responseText)}catch(e){xml = FWK.Util.xmlHttpRequest.responseXML || xml}
					}
				}
				FWK.Util.AjaxList.callBack(xml);
			}
			FWK.Util.AjaxList.onReady();
		}
	},
	abortNext:function(){
		FWK.Util.xmlHttpRequest.abort();
		FWK.Util.AjaxList.callBack(false);
		FWK.Util.AjaxList.onReady();
	},
	onReady:function(){
		FWK.Util.AjaxList.isIdlesse = true;
		if(FWK.Util.AjaxList.requests.length>0){
			FWK.Util.AjaxList.submit.apply(FWK.Util.AjaxList,FWK.Util.AjaxList.requests.shift());
		}
	},
	destroy : function(){
		FWK.Util.xmlHttpRequest = null;
		delete FWK.Util.xmlHttpRequest;
	}
}

FWK.addEvent(window,"unload",function(){
	try{FWK.Util.AjaxList.destroy();}catch(e){}
});
